/*
 * @Description: 
 * @Author: BaldHead
 * @Date: 2022-03-31 11:18:15
 * @LastEditTime: 2022-04-03 14:50:13
 * @LastEditors: Please set LastEditors
 */
// 1 个6~16 位的字符串， 必须同时含有大小写字母和数字

//1-10位：数组、字母、下划线组成的字符串，必须有_

//字符串中包含"\w"，但是必须包含_

//实现一个$attr(name, value)遍历，属性名为name，值为value的的元素合集  属性选择器

//(5).add(3).minus(2)返回6  链式反应
~ function() {
    //=>每一个方法执行完。都要返回Number()这个类的实例，这样才可以继续调取Number类原型中的方法(链式写法)]
    function check(n) {
        n = Number(n);
        return isNaN(n) ? 0 : n;
    }

    function add(n) {
        n = check(n);
        return this + n; //this只能改变指向，不能赋值
    }

    function minus(n) {
        n = check(n);
        return this - n;
    }

    ["add", "minus"].forEach(item => {
        Number.prototype[item] = eval(item);
    });
}();
console.log((5).add(3).minus(2));
//箭头函数与普通函数有什么区别 
//1.箭头函数语法上比普通函数更加简洁（ES6每一种函数都可以形参赋值默认值和剩余运算符）
// 2.箭头函数中没有自己的this,它里面的this继承于函数所处的上下文的this(使用call和apply等任何方式都无法改变rhis的指向) 
//3.箭头函数没有类数组(arguments),只能通过...args获取参数集合
//4箭头函数不能被new(因为箭头函数没有prototype和this)
function fn(x) {
    return function(y) {
        return x + y;
    }
}
let fn_1 = x => {
    // return y => {
    //     return x + y;
    // }
    return y => x + y;
}

let fn_2 = x => y => x + y;

let obj = {
    name: 'OBJ'
}

function fn1() {
    console.log(this);
}
fn1.call(obj);
let fn2 = () => {
    console.log(this);
}
fn2.call(obj)
document.body.onclick = () => {
    //this:windows 不是当前操作的body了

}
document.body.onclick = function() {
    //this:body 
    arr.sort(
        //this:arr
        function(a, b) {
            //this:window  回调函数中的this一般都是window   
            //回调函数当作值传给了另一个方法，一个方法执行，函数执行
            return a - b;
        })
    setTimeout(function() {}, )

}
document.body.onclick = function() {
    //this:body 
    arr.sort(
        //this:arr
        (a, b) => {
            //this:window  回调函数中的this一般都是window   
            //回调函数当作值传给了另一个方法，一个方法执行，函数执行
            return a - b;
        })
    setTimeout(function() {}, )

}

//回调函数  foreach源码
//回调函数:把一个函数B作为实参传给另外一个函数A，函数A在执行的时候，可以把传递进来的函数B去执行(执行N次，可传值,改变this)
function each(arr, callBack) {
    //callBackL:function(item,index)
    for (let i = 0; i < arr.length; i++) {
        // let element = arr[i];
        // index = i;
        // callBack(element, index);
        //回调函数中的this一般是window
        let flag = callBack.call(arr, a[i], i);
        //接受回调函数返回的结果，如果是false,技术循环
        if (flag === false) {
            break;
        }
        // callBack(arr[i], i)
    }
}
each([10, 12, 24, 45], function(item, index) {
        //this:原始数组
        if (index > 1) {
            return false;
        }
    })
    //箭头函数餐宿
let fnArg = (...arg) => {
    //console.log(arguments); //ReferenceError: arguments is not defined
    console.log(arg); // [10, 20, 30]
}
fnArg(10, 20, 30);
//不能被new 因为
function Fn() {}
Fn.prototype.getX = function() {}
let f = new Fn
f //Fn  {}
let fn = () => {}
console.dir(fn)
let F = new fn; // Uncaught TypeError: fn is not a constructor

//写一个函数放在Array原型上  可以有返回值结束循环
//function each2(arr, callBack) {
//     for (let i = 0; i < arr.length; i++) {
//         let flag = callBack.call(arr[i], i);
//         if (flag == false) break;
//     }
// }
// Array.prototype.myEach = each2

//     [10, 20, 30, 40].myEach()